/**
 * 警察AI
 * 负责警察的追赶逻辑
 */
class PoliceAI {
    constructor(game) {
        // 游戏实例引用
        this.game = game;
        
        // 警察元素
        this.policeElement = document.getElementById('police-character');
        
        // 距离指示器
        this.distanceIndicator = document.getElementById('distance-indicator');
        
        // 警察状态
        this.isChasing = false;
        
        // 基础追赶速度 (每秒减少的距离百分比)
        this.baseSpeed = 2;
        
        // 加速系数 (随时间增加)
        this.accelerationFactor = 0.1;
        
        // 当前速度
        this.currentSpeed = this.baseSpeed;
        
        // 上次更新时间
        this.lastUpdateTime = 0;
        
        // 动画帧计数
        this.frameCount = 0;
        
        // 动画速度
        this.animationSpeed = 8;
        
        // 难度系数
        this.difficultyFactor = 1;
    }
    
    /**
     * 初始化警察AI
     */
    init() {
        // 重置状态
        this.isChasing = false;
        this.startTime = 0;
        
        // 设置难度系数
        switch (this.game.difficulty) {
            case 'easy':
                this.difficultyFactor = 0.8;
                break;
            case 'medium':
                this.difficultyFactor = 1;
                break;
            case 'hard':
                this.difficultyFactor = 1.3;
                break;
            default:
                this.difficultyFactor = 1;
        }
        
        // 重置状态
        this.reset();
        
        // 更新警察样式
        if (this.policeElement) {
            this.policeElement.className = '';
            this.policeElement.classList.add('police-character');
            
            // 设置初始位置（先移除过渡效果，设置位置后再添加）
            // 暂时移除过渡效果
            this.policeElement.style.transition = 'none';
            
            // 设置初始位置
            this.policeElement.style.left = '0px';
            
            // 强制重绘
            this.policeElement.offsetHeight;
            
            // 恢复过渡效果
            setTimeout(() => {
                this.policeElement.style.transition = 'left 0.3s ease-out';
            }, 50);
        }
    }
    
    /**
     * 开始追赶
     */
    startChasing() {
        this.isChasing = true;
        this.lastUpdateTime = Date.now();
        console.log('警察开始追赶');
    }
    
    /**
     * 停止追赶
     */
    stopChasing() {
        this.isChasing = false;
    }
    
    /**
     * 更新警察状态
     * @param {number} elapsedTime 游戏已进行时间(秒)
     */
    update(elapsedTime) {
        if (!this.isChasing) return;
        
        const now = Date.now();
        const deltaTime = (now - this.lastUpdateTime) / 1000;
        
        // 更新动画
        this.updateAnimation(deltaTime);
        
        // 计算当前速度 (随时间增加)
        this.currentSpeed = this.baseSpeed + (elapsedTime * this.accelerationFactor);
        
        // 应用难度系数
        this.currentSpeed *= this.difficultyFactor;
        
        this.lastUpdateTime = now;
    }
    
    /**
     * 计算警察与小偷的距离
     * @param {number} thiefSpeed 小偷当前速度(WPM)
     * @returns {number} 距离百分比 (0-100)
     */
    calculateDistance(thiefSpeed) {
        if (!this.isChasing) return 80; // 初始距离
        
        // 获取当前距离
        let distance = this.game.gameData.distance;
        
        // 获取时间差
        const now = Date.now();
        const deltaTime = (now - this.lastUpdateTime) / 1000;
        
        // 获取小偷速度倍率
        const speedMultiplier = this.game.characterManager.getSpeedMultiplier();
        
        // 计算小偷逃跑速度
        const escapeSpeed = (thiefSpeed / 30) * speedMultiplier;
        
        // 计算警察追赶速度
        const chaseSpeed = this.currentSpeed;
        
        // 计算速度差
        const speedDifference = escapeSpeed - chaseSpeed;
        
        // 更新距离
        distance += speedDifference * deltaTime * 5;
        
        // 限制距离范围
        distance = Math.max(0, Math.min(100, distance));
        
        // 更新距离指示器
        if (this.distanceIndicator) {
            this.distanceIndicator.style.width = `${distance}%`;
            
            // 根据距离改变颜色
            if (distance < 20) {
                this.distanceIndicator.style.backgroundColor = '#e74c3c'; // 危险
            } else if (distance < 50) {
                this.distanceIndicator.style.backgroundColor = '#f39c12'; // 警告
            } else {
                this.distanceIndicator.style.backgroundColor = '#3498db'; // 安全
            }
        }
        
        return distance;
    }
    
    /**
     * 更新警察动画
     * @param {number} deltaTime 时间差(秒)
     */
    updateAnimation(deltaTime) {
        // 更新帧计数
        this.frameCount += deltaTime * this.animationSpeed;
        
        if (this.policeElement) {
            // 简单的上下浮动动画
            const bounceHeight = Math.sin(this.frameCount) * 5;
            
            // 根据追赶速度调整动画
            const intensity = Math.min(1.5, this.currentSpeed / this.baseSpeed);
            
            this.policeElement.style.transform = `translateY(${bounceHeight}px) rotate(${Math.sin(this.frameCount * 2) * 3 * intensity}deg)`;
        }
    }
    
    /**
     * 重置警察AI
     */
    reset() {
        // 重置状态
        this.isChasing = false;
        this.startTime = 0;
        
        // 重置位置（先移除过渡效果，设置位置后再添加）
        if (this.policeElement) {
            // 暂时移除过渡效果
            this.policeElement.style.transition = 'none';
            
            // 设置初始位置
            this.policeElement.style.left = '0px';
            
            // 强制重绘
            this.policeElement.offsetHeight;
            
            // 恢复过渡效果
            setTimeout(() => {
                this.policeElement.style.transition = 'left 0.3s ease-out';
            }, 50);
        }
        
        this.currentSpeed = this.baseSpeed;
        this.frameCount = 0;
        this.lastUpdateTime = Date.now();
        
        // 重置距离指示器
        if (this.distanceIndicator) {
            this.distanceIndicator.style.width = '80%';
            this.distanceIndicator.style.backgroundColor = '#3498db';
        }
    }
    
    /**
     * 更新警察位置
     */
    updatePosition() {
        if (!this.policeElement) return;
        
        // 计算警察位置（基于距离）
        const distance = this.calculateDistance(this.game.gameData.wpm);
        const gameScene = document.getElementById('game-scene');
        const sceneWidth = gameScene ? gameScene.offsetWidth : 1000;
        
        // 获取小偷位置
        const thiefElement = document.getElementById('thief-character');
        const thiefLeft = thiefElement ? parseFloat(getComputedStyle(thiefElement).left) || 0 : 0;
        
        // 计算警察位置（距离小偷的百分比转换为像素）
        const policeLeft = Math.max(0, thiefLeft - (sceneWidth * (100 - distance) / 100));
        
        // 设置警察位置
        this.policeElement.style.left = `${policeLeft}px`;
        
        // 根据距离调整警察动画速度
        const animationSpeed = Math.max(0.5, Math.min(2, (100 - distance) / 50));
        this.policeElement.style.animationDuration = `${1 / animationSpeed}s`;
    }
} 